package NEGOCIOS;

import BD.Pagoscliente;
import BD.PersonFactory;
import java.awt.HeadlessException;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

public class ControlPagoClientes {

    public SessionFactory sessionFactory = null;
    private Session session;
    private Transaction transaction;

    /*
     * Metodo usado para crear la sesion nesesaria para poder interactuar, mediante
     * Hibernate, con la base de datos.
     */
    private Session crearSession() {
        Session session = null;
        try {
            /*Creando la session mediante la clase PersonFactory que es la que
             conditne la configuracion de Hivernate.*/
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
        } /*En caso de error lo capturo y lo reporto mediande un JOptionPane, y
         cierro la session.*/ catch (HibernateException he) {
            JOptionPane.showMessageDialog(null, "Error: " + he, "Error ocurrido"
                    + " en el control de PagoClientes", 0);
            session.close();
        }
        return session;
    }

    public void iniciaSF() {
        try {
            session = null;
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
            transaction = session.beginTransaction();
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de stock.", "Error al iniciar Session",
                    0);
        }

    }

    public void cierraSF() {
        try {
            transaction.commit();
            session.flush();
            session.close();
        } catch (HibernateException e) {
            JOptionPane.showMessageDialog(null, "error: " + e + "\n"
                    + "En el controlador de stock.", "Error al cerrar Session",
                    0);
            System.out.println(e);
        }
    }

    //Metodo que regresa un pago en especifico
    public Pagoscliente seleccionarUno(int id) {
        //Crear el objeto que contendra el pago que se quiere seleccionar
        Pagoscliente pagocliente = null;
        try {
            iniciaSF(); //Obtengo el Pago del cliente que tiene el id que quiero
            pagocliente = (Pagoscliente) session.createQuery("from PagosCliente"
                    + " pc where pc.id=" + id).list().get(0);
            cierraSF();
        } catch (Exception e) {
            throw e;
        }
        //Regreso el pago del cliente obtenido de la base de datos
        return pagocliente;
    }

    //Metodo que regresa todos los pagos guardados en la DB
    public List seleccionarTodosPagosClientes() {
        //Crear el objeto que contendra todos los pagos
        List pagoscliente;
        try {
            //Crear session
            Session session = crearSession();
            //Obtengo todos los pagos 
            pagoscliente = session.createQuery("from Pagoscliente pc").list();
            //Cierro la session
            session.close();
        } catch (Exception e) {
            session.close();
            throw e;
        }
        //Regreso el pago del cliente obtenido de la base de datos
        return pagoscliente;
    }

    //Metodo que guarda un pago en la DB
    public void agregarPagoCliente(Date fecha, String nombre, Double total) {
        //Crear session
        Session session = crearSession();
        try {
            //Creo e inicion la transaccion para controlar la insercion
            Transaction tx = session.beginTransaction();
            tx.begin();

            /*Creo el objeto para armarlo y posteriormente guardarlo en la base
             de datos*/
            Pagoscliente pagoCliente = new Pagoscliente();

            //Lleno el objeto para guardarlo en la base de datos
            pagoCliente.setFecha(fecha);
            pagoCliente.setNombre(nombre);
            pagoCliente.setTotal(total);

            //Guardo el objeto en la base de datos
            session.save(pagoCliente);
            //Si todo salio bien cierro session y termino la transaccion
            tx.commit();
            session.close();
            JOptionPane.showMessageDialog(null, "Pago del cliente guardado "
                    + "satisfactoriamente", "Guardado", 1);
        } catch (HibernateException | HeadlessException e) {
            session.close();
            throw e;
        }
    }

    //Metodo que actualiza un pago guardado en la DB
    public void actualizarPagoCliente(int id, Date fecha, String nombre, Double total) {
        //Creo la session
        Session session = crearSession();
        try {
            //Creo la transaccion
            Transaction tx = session.beginTransaction();
            //Obtengo el pago que se desea modificar
            Pagoscliente pagoCliente = seleccionarUno(id);

            //Inicio la transaccion
            tx.begin();

            //lleno el objeto con los datos nuevos
            pagoCliente.setFecha(fecha);
            pagoCliente.setNombre(nombre);
            pagoCliente.setTotal(total);

            //Actualizo el objeto en la base de datos
            session.update(pagoCliente);

            //si todo salio bien realizo la transacion y cierro session
            tx.commit();
            session.close();
        } catch (Exception e) {
            session.close();
            throw e;
        }
    }

    //Metodo que elimina un pago en espesifico
    public void eliminarPagoCliente(int id) {
        //Creo la session
        Session session = crearSession();
        try {
            //Obtengo el objeto que quiero eliminar de la base de datos
            Pagoscliente pagoCliente = seleccionarUno(id);
            //Borro el objeto de la base de datos
            session.delete(pagoCliente);
            //Cierro la session
            session.close();
        } catch (HibernateException he) {
            session.close();
            throw he;
        }
    }
}
